package com.zhaojk.audio.domain;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;
import java.util.Map;

/**
 * T2A请求对象
 *
 * @author zhaojk
 */
@Data
public class T2ARequest {
    /**
     * 必填
     * 请求的模型版本：speech-02-hd、speech-02-turbo、speech-01-hd、speech-01-turbo、speech-01-240228、speech-01-turbo-240228
     */
    private String model;
    /**
     * 必填
     * 待合成的文本，长度限制<10000字符，段落切换用换行符替代。
     * （如需要控制语音中间隔时间，在字间增加<#x#>,x单位为秒，支持0.01-99.99，最多两位小数）。
     * 支持自定义文本与文本之间的语音时间间隔，以实现自定义文本语音停顿时间的效果。
     * 需要注意的是文本间隔时间需设置在两个可以语音发音的文本之间，且不能设置多个连续的时间间隔。
     */
    private String text;
    /**
     * 是否流式。默认false，即不开启流式。
     */
    private boolean stream;

    @JsonProperty("voice_setting")
    private VoiceSetting voiceSetting;
    /**
     * key: "tone", value: 替换发音的列表。例如："tone": ["燕少飞/(yan4)(shao3)(fei1)","达菲/(da2)(fei1)"，"omg/oh my god"]
     * 替换需要特殊标注的文字、符号及对应的注音。
     * 替换发音（调整声调/替换其他字符发音），格式如下：
     * ["燕少飞/(yan4)(shao3)(fei1)","达菲/(da2)(fei1)"，"omg/oh my god"]
     * 声调用数字代替，一声（阴平）为1，二声（阳平）为2，三声（上声）为3，四声（去声）为4），轻声为5。
     */
    @JsonProperty("pronunciation_dict")
    private Map<String, List<String>> pronunciationDict;
    @JsonProperty("audio_setting")
    private AudioSetting audioSetting;

    @Data
    public static class VoiceSetting {
        /**
         * 请求的音色编号。与timber_weights二选一“必填”。
         * 支持系统音色(id)以及复刻音色（id）两种类型，其中系统音色（ID）如下：
         * 青涩青年音色：male-qn-qingse
         * 精英青年音色：male-qn-jingying
         * 霸道青年音色：male-qn-badao
         * 青年大学生音色：male-qn-daxuesheng
         * 少女音色：female-shaonv
         * 御姐音色：female-yujie
         * 成熟女性音色：female-chengshu
         * 甜美女性音色：female-tianmei
         * 男性主持人：presenter_male
         * 女性主持人：presenter_female
         * 男性有声书1：audiobook_male_1
         * 男性有声书2：audiobook_male_2
         * 女性有声书1：audiobook_female_1
         * 女性有声书2：audiobook_female_2
         * 青涩青年音色-beta：male-qn-qingse-jingpin
         * 精英青年音色-beta：male-qn-jingying-jingpin
         * 霸道青年音色-beta：male-qn-badao-jingpin
         * 青年大学生音色-beta：male-qn-daxuesheng-jingpin
         * 少女音色-beta：female-shaonv-jingpin
         * 御姐音色-beta：female-yujie-jingpin
         * 成熟女性音色-beta：female-chengshu-jingpin
         * 甜美女性音色-beta：female-tianmei-jingpin
         * 聪明男童：clever_boy
         * 可爱男童：cute_boy
         * 萌萌女童：lovely_girl
         * 卡通猪小琪：cartoon_pig
         * 病娇弟弟：bingjiao_didi
         * 俊朗男友：junlang_nanyou
         * 纯真学弟：chunzhen_xuedi
         * 冷淡学长：lengdan_xiongzhang
         * 霸道少爷：badao_shaoye
         * 甜心小玲：tianxin_xiaoling
         * 俏皮萌妹：qiaopi_mengmei
         * 妩媚御姐：wumei_yujie
         * 嗲嗲学妹：diadia_xuemei
         * 淡雅学姐：danya_xuejie
         * Santa Claus：Santa_Claus
         * Grinch：Grinch
         * Rudolph：Rudolph
         * Arnold：Arnold
         * Charming Santa：Charming_Santa
         * Charming Lady：Charming_Lady
         * Sweet Girl：Sweet_Girl
         * Cute Elf：Cute_Elf
         * Attractive Girl：Attractive_Girl
         * Serene Woman：Serene_Woman
         */
        @JsonProperty("voice_id")
        private String voiceId;
        /**
         * 范围[0.5,2]，默认值为1.0
         * 生成声音的语速，可选，取值越大，语速越快。
         */
        private int speed;
        /**
         * 范围（0,10]，默认值为1.0
         * 生成声音的音量，可选，取值越大，音量越高。
         */
        private int vol;
        /**
         * 范围[-12,12]，默认值为0.
         * 生成声音的语调，可选，（0为原音色输出，取值需为整数）。
         */
        private int pitch;
        /**
         * 控制合成语音的情绪；
         * 当前支持7种情绪：高兴，悲伤，愤怒，害怕，厌恶，惊讶，中性；
         * 参数范围["happy", "sad", "angry", "fearful", "disgusted", "surprised", "neutral"]
         * 该参数仅对
         * speech-02-hd，speech-02-turbo，speech-01-turbo，speech-01-hd生效
         */
        private String emotion;
    }

    @Data
    public static class AudioSetting {
        /**
         * 范围【8000，16000，22050，24000，32000，44100】
         * 生成声音的采样率。可选，默认为32000。
         */
        @JsonProperty("sample_rate")
        private int sampleRate;
        /**
         * 范围【32000，64000，128000，256000】
         * 生成声音的比特率。可选，默认值为128000。该参数仅对mp3格式的音频生效。
         */
        private int bitrate;
        /**
         * 生成的音频格式。默认mp3，范围[mp3,pcm,flac,wav]。wav仅在非流式输出下支持。
         */
        private String format;
        /**
         * 生成音频的声道数.默认1：单声道，可选：
         * 1：单声道
         * 2：双声道
         */
        private int channel;
    }
}
